Loading In the Data
emdat <- read_csv(here("full_emdat_geocoded_finally.csv"))
Warning: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
dat <- vroom(...)
problems(dat)Rows: 74035 Columns: 51── Column specification ──────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (27): Dis No, Seq, Disaster Group, Disaster Subgroup, Disaster Type, Disaster Subtype...
dbl (18): Year, Dis Mag Value, Start Year, Start Month, Start Day, End Year, End Month, E...
lgl (5): Glide, Aid Contribution, Reconstruction Costs ('000 US$), Admin1 Code, uncertai...
time (1): Local Time
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
ENSO data
emdat_hydrological_enso %>%
filter(!is.na(enso_Value)) %>%
filter(!is.na(wet)) %>%
mutate(enso_positive = (enso_Value > 0)) %>%
group_by(`Dis No`) %>%
summarize(enso_pos = any(enso_positive),enso_val = mean(enso_Value), is_wet = any(wet)) %>%
ggplot(mapping = aes(x = enso_val, fill = is_wet)) +
geom_histogram(stat = "density") +
facet_grid(~is_wet) +
ggtitle("Counts of Disasters compared to value of ONI with wet disasters in Blue and Dry in Red")
Warning: Ignoring unknown parameters: `binwidth`, `bins`, and `pad`







resy <- 2.5
emdat_hydrological_enso %>%
left_join(event_num_months, by = c("Event")) %>%
filter(!is.na(enso_Value)) %>%
filter(!is.na(wet)) %>%
filter(!is.na(lat)) %>%
mutate(wet_factor = as_factor(wet)) %>%
mutate(Event_factor = fct_recode(as_factor(Event), no_event = "N", negative = "-", positive = "+")) %>%
mutate(wet_string = fct_recode(wet_factor, wet_disasters = "TRUE", dry_disasters = "FALSE")) %>%
mutate(lat_box = (as.integer(lat) %/% resy) * resy , lng_box = (as.integer(lng) %/% resy) * resy) %>%
mutate(dis_no_factor = as_factor(`Dis No`)) %>%
group_by(lat_box, lng_box, Event_factor, wet_string, dis_no_factor) %>%
summarize(num_months = first(num_months), num_disaster_month = mean(num_months_disaster)) %>%
group_by(lat_box, lng_box, Event_factor, wet_string) %>%
summarize(num_months = first(num_months), num_disaster_months = sum(num_disaster_month)) %>%
mutate(disaster_rate = num_disaster_months / num_months) %>%
pivot_wider(id_cols = c(lat_box, lng_box), names_from = c(Event_factor, wet_string), values_from = c(disaster_rate), values_fill = 0) %>%
mutate(positive_wet_relative_risk = positive_wet_disasters / no_event_wet_disasters,
negative_wet_relative_risk = negative_wet_disasters / no_event_wet_disasters,
positive_dry_relative_risk = positive_dry_disasters / no_event_dry_disasters,
negative_dry_relative_risk = negative_dry_disasters / no_event_dry_disasters) %>%
select(lat_box, lng_box, positive_wet_relative_risk, negative_wet_relative_risk, positive_dry_relative_risk, negative_dry_relative_risk) %>%
pivot_longer(cols = c(positive_wet_relative_risk, negative_wet_relative_risk, positive_dry_relative_risk, negative_dry_relative_risk), names_to = 'risk', values_to = 'value') %>%
mutate(risk_factor = as_factor(risk), values_cleaned = if_else(is.infinite(value), 18, value)) %>%
mutate(relative_risk_cleaned = if_else(is.nan(values_cleaned), 0, values_cleaned)) %>%
mutate(relative_risk_cleaned2 = if_else((relative_risk_cleaned) > 2, 2, relative_risk_cleaned)) %>%
ggplot() +
geom_sf(data = world_map) +
geom_tile(mapping = aes(x = lng_box, y = lat_box, fill = relative_risk_cleaned2, width = resy)) +
scale_fill_gradient2(midpoint = 1, limits = c(0, 2), low = 'cyan', high = 'red') +
facet_grid(rows = vars(risk_factor))+
ggtitle("Relative risk plot using calculations of the form [{num_disasters_positive_wet / num_months_positive} / {num_disasters_no_event_wet / num_months_no_event}]")
`summarise()` has grouped output by 'lat_box', 'lng_box', 'Event_factor', 'wet_string'. You can override using the `.groups` argument.`summarise()` has grouped output by 'lat_box', 'lng_box', 'Event_factor'. You can override using the `.groups` argument.

NA
NA
resy <- 2.5
emdat_hydrological_enso %>%
left_join(event_num_months, by = c("Event")) %>%
filter(!is.na(enso_Value)) %>%
filter(!is.na(wet)) %>%
filter(!is.na(lat)) %>%
mutate(wet_factor = as_factor(wet)) %>%
mutate(Event_factor = fct_recode(as_factor(Event), no_event = "N", negative = "-", positive = "+")) %>%
mutate(wet_string = fct_recode(wet_factor, wet_disasters = "TRUE", dry_disasters = "FALSE")) %>%
mutate(lat_box = (as.integer(lat) %/% resy) * resy , lng_box = (as.integer(lng) %/% resy) * resy) %>%
mutate(dis_no_factor = as_factor(`Dis No`)) %>%
group_by(lat_box, lng_box, Event_factor, wet_string, dis_no_factor) %>%
summarize(num_months = first(num_months), num_disaster_month = mean(num_months_disaster)) %>%
group_by(lat_box, lng_box, Event_factor, wet_string) %>%
summarize(num_months = first(num_months), num_disaster_months = sum(num_disaster_month)) %>%
mutate(disaster_rate = num_disaster_months / num_months) %>%
pivot_wider(id_cols = c(lat_box, lng_box), names_from = c(Event_factor, wet_string), values_from = c(disaster_rate), values_fill = 0) %>%
mutate(positive_wet_percent = positive_wet_disasters / (no_event_wet_disasters + positive_wet_disasters + negative_wet_disasters) ,
negative_wet_percent = negative_wet_disasters / (no_event_wet_disasters + positive_wet_disasters + negative_wet_disasters),
positive_dry_percent = positive_dry_disasters / (no_event_dry_disasters + positive_dry_disasters + negative_dry_disasters),
negative_dry_percent = negative_dry_disasters / (no_event_dry_disasters + positive_dry_disasters + negative_dry_disasters)
) %>%
select(lat_box, lng_box, positive_wet_percent, negative_wet_percent, positive_dry_percent, negative_dry_percent) %>%
pivot_longer(cols = c(positive_wet_percent, negative_wet_percent, positive_dry_percent, negative_dry_percent), names_to = 'typey', values_to = 'value') %>%
mutate(type_factor = as_factor(typey), values = if_else(is.nan(value), 0, value)) %>%
ggplot() +
geom_sf(data = world_map) +
geom_tile(mapping = aes(x = lng_box, y = lat_box, fill = values, width = resy)) +
scale_fill_gradient(low = 'white', high = 'red') +
facet_grid(rows = vars(type_factor))+
ggtitle("Disaster Percent plot using calculations of the form [positive_wet / all_wet]")
`summarise()` has grouped output by 'lat_box', 'lng_box', 'Event_factor', 'wet_string'. You can override using the `.groups` argument.`summarise()` has grouped output by 'lat_box', 'lng_box', 'Event_factor'. You can override using the `.groups` argument.

LS0tCnRpdGxlOiAiRU5TTyBhbmFseXNpcyBuZXciCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKIyMgUGFja2FnZXMKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzZikKbGlicmFyeShoZXJlKQpsaWJyYXJ5KHdlZWQpCmxpYnJhcnkocm5hdHVyYWxlYXJ0aCkKbGlicmFyeShybmF0dXJhbGVhcnRoZGF0YSkKYGBgCgojIyBMb2FkaW5nIEluIHRoZSBEYXRhCgpgYGB7cn0KZW1kYXQgPC0gcmVhZF9jc3YoaGVyZSgiZnVsbF9lbWRhdF9nZW9jb2RlZF9maW5hbGx5LmNzdiIpKQpgYGAKIyBIb3cgbWFueSBkaXNhc3RlcnMgd2VyZSBsb2NhdGVkPwoKYGBge3J9CmVtZGF0ICU+JQogIHBlcmNlbnRfbG9jYXRlZF9kaXNhc3RlcnMocGxvdF9yZXN1bHQ9RkFMU0UpCmBgYAoKIyBIb3cgbWFueSBsb2NhdGlvbnMgd2VyZSBsb2NhdGVkPwoKYGBge3J9CmVtZGF0ICU+JQogIHBlcmNlbnRfbG9jYXRlZF9sb2NhdGlvbnMocGxvdF9yZXN1bHQ9RkFMU0UpCmBgYAojIEFsbCB0eXBlcyBvZiBkaXNhc3RlcnMKCmBgYHtyfQplbWRhdCAlPiUKICBncm91cF9ieShgRGlzYXN0ZXIgVHlwZWApICU+JQogIGNvdW50KCkKYGBgCgojIFJlc3RyaWN0IHRvIGRyeSBhbmQgd2V0IGh5ZHJvbG9naWNhbCBkaXNhc3RlcnMKCmBgYHtyfQpkcnlfbGlzdCA8LSBjKCJEcm91Z2h0IiwgIkV4dHJlbWUgdGVtcGVyYXR1cmUiLCAiV2lsZGZpcmUiKQp3ZXRfbGlzdCA8LSBjKCJGbG9vZCIsICJMYW5kc2xpZGUiLCAiU3Rvcm0iKQoKZW1kYXRfaHlkcm9sb2dpY2FsIDwtIGVtZGF0ICU+JQogIGZpbHRlcihgRGlzYXN0ZXIgVHlwZWAgJWluJSBjKGRyeV9saXN0LCB3ZXRfbGlzdCkpICU+JQogIG11dGF0ZShkcnkgPSAoYERpc2FzdGVyIFR5cGVgICVpbiUgZHJ5X2xpc3QpLCB3ZXQgPSAoYERpc2FzdGVyIFR5cGVgICVpbiUgd2V0X2xpc3QpKQpgYGAKCmBgYHtyfQplbWRhdF9oeWRyb2xvZ2ljYWwgJT4lCiAgZ3JvdXBfYnkoYERpc2FzdGVyIFR5cGVgKSAlPiUKICBjb3VudCgpCmBgYAoKIyBFTlNPIGRhdGEKCmBgYHtyfQplbnNvX2RhdGEgPC0gcmVhZF9jc3YoaGVyZSgiZGF0YSIsImVuc29fZGF0YV9jb3B5Mi5jc3YiKSkKZW5zb19kYXRhICU+JQogIGdyb3VwX2J5KEV2ZW50KSAlPiUKICBjb3VudCgpCmBgYAoKYGBge3J9CmVtZGF0X2h5ZHJvbG9naWNhbF9lbnNvIDwtIGVtZGF0X2h5ZHJvbG9naWNhbCAlPiUKICBmdWxsX2pvaW4oZW5zb19kYXRhLCBieSA9IGMoIlllYXIiID0gIlllYXIiLCAiU3RhcnQgTW9udGgiID0gIk1vbnRoTnVtIikpICU+JQogIHJlbmFtZSgiZW5zb19WYWx1ZSIgPSAiVmFsdWUiKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGBTdGFydCBNb250aGApKSAlPiUKICBtdXRhdGUoc3RhcnRfeWVhciA9IGlmX2Vsc2UoaXMubmEoYFN0YXJ0IFllYXJgKSwgWWVhciwgYFN0YXJ0IFllYXJgKSkgJT4lCiAgbXV0YXRlKGVuZF95ZWFyID0gaWZfZWxzZShpcy5uYShgRW5kIFllYXJgKSwgc3RhcnRfeWVhciwgYEVuZCBZZWFyYCkpICU+JQogIG11dGF0ZShlbmRfbW9udGggPSBpZl9lbHNlKGlzLm5hKGBFbmQgTW9udGhgKSwgYFN0YXJ0IE1vbnRoYCwgYEVuZCBNb250aGApKSAlPiUKICBtdXRhdGUobnVtX21vbnRoc19kaXNhc3RlciA9IChlbmRfbW9udGggLSBgU3RhcnQgTW9udGhgICsgMSkgKyAxMiAqIChlbmRfeWVhciAtIHN0YXJ0X3llYXIpKSAlPiUKICBmaWx0ZXIobnVtX21vbnRoc19kaXNhc3RlciA+IDApCgplbWRhdF9oeWRyb2xvZ2ljYWxfZW5zbyAlPiUKICBncm91cF9ieShudW1fbW9udGhzX2Rpc2FzdGVyKSAlPiUKICBzdW1tYXJpemUoY291bnRfZGlzYXN0ZXJzID0gbl9kaXN0aW5jdChgRGlzIE5vYCkpCmBgYAoKYGBge3J9CmVtZGF0X2h5ZHJvbG9naWNhbF9lbnNvICU+JQogIGZpbHRlcighaXMubmEoZW5zb19WYWx1ZSkpICU+JQogIGZpbHRlcighaXMubmEod2V0KSkgJT4lCiAgbXV0YXRlKGVuc29fcG9zaXRpdmUgPSAoZW5zb19WYWx1ZSA+IDApKSAlPiUKICBncm91cF9ieShgRGlzIE5vYCkgJT4lCiAgc3VtbWFyaXplKGVuc29fcG9zID0gYW55KGVuc29fcG9zaXRpdmUpLGVuc29fdmFsID0gbWVhbihlbnNvX1ZhbHVlKSwgaXNfd2V0ID0gYW55KHdldCkpICU+JQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBlbnNvX3ZhbCwgZmlsbCA9IGlzX3dldCkpICsKICAgIGdlb21faGlzdG9ncmFtKHN0YXQgPSAiZGVuc2l0eSIpICsKICAgIGZhY2V0X2dyaWQofmlzX3dldCkgKwogIGdndGl0bGUoIkNvdW50cyBvZiBEaXNhc3RlcnMgY29tcGFyZWQgdG8gdmFsdWUgb2YgT05JIHdpdGggd2V0IGRpc2FzdGVycyBpbiBCbHVlIGFuZCBEcnkgaW4gUmVkIikKYGBgCmBgYHtyfQplbWRhdF9oeWRyb2xvZ2ljYWxfZW5zbyAlPiUKICBmaWx0ZXIoIWlzLm5hKGVuc29fVmFsdWUpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHdldCkpICU+JQogICNtdXRhdGUoZW5zb19wb3NpdGl2ZSA9IChlbnNvX1ZhbHVlID4gMCkpICU+JQogIGdyb3VwX2J5KGBEaXMgTm9gKSAlPiUKICBzdW1tYXJpemUoZW5zb19ldmVudCA9IGZpcnN0KEV2ZW50KSxlbnNvX3ZhbCA9IG1lYW4oZW5zb19WYWx1ZSksIGlzX3dldCA9IGFueSh3ZXQpLCBpc19kcnkgPSBhbnkoZHJ5KSkgJT4lCiAgbXV0YXRlKGlzX3dldF9udW0gPSBhcy5udW1lcmljKGlzX3dldCksIGlzX2RyeV9udW0gPSBhcy5udW1lcmljKGlzX2RyeSkpICU+JQogIGdyb3VwX2J5KGVuc29fZXZlbnQpICU+JQogIHN1bW1hcml6ZShudW1fZGlzYXN0ZXJzX3dldCA9IHN1bShpc193ZXRfbnVtKSwgbnVtX2Rpc2FzdGVyc19kcnkgPSBzdW0oaXNfZHJ5X251bSkpCmBgYApgYGB7cn0Kd29ybGRfbWFwIDwtIHJuYXR1cmFsZWFydGg6Om5lX2NvdW50cmllcyhzY2FsZSA9ICJtZWRpdW0iLCByZXR1cm5jbGFzcyA9ICJzZiIpCgplbWRhdF9oeWRyb2xvZ2ljYWxfZW5zbyAlPiUKICBmaWx0ZXIoIWlzLm5hKGVuc29fVmFsdWUpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHdldCkpICU+JQogIGZpbHRlcighaXMubmEobGF0KSkgJT4lCiAgbXV0YXRlKGVuc29fcG9zaXRpdmUgPSAoZW5zb19WYWx1ZSA+IDApKSAlPiUKICBtdXRhdGUod2V0X2ZhY3RvciA9IGFzX2ZhY3Rvcih3ZXQpKSAlPiUKICBtdXRhdGUod2V0X3N0cmluZyA9IGZjdF9yZWNvZGUod2V0X2ZhY3Rvciwgd2V0X2Rpc2FzdGVycyA9ICJUUlVFIiwgZHJ5X2Rpc2FzdGVycyA9ICJGQUxTRSIpKSAlPiUKICBzZWxlY3QobG5nLCBsYXQsIGVuc29fVmFsdWUsIHdldF9zdHJpbmcpICU+JQogICNoZWFkKG4gPSA1MEwpICU+JQogIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSB3b3JsZF9tYXApICsKICBnZW9tX3RpbGUobWFwcGluZyA9IGFlcyh4ID0gbG5nLCB5ID0gbGF0LCBmaWxsID0gZW5zb19WYWx1ZSwgd2lkdGggPSAyLCBoZWlnaHQgPSAyKSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0iYmx1ZSIsIG1pZCA9ICJ3aGl0ZSIsIGhpZ2ggPSAicmVkIikgKwogIGZhY2V0X2dyaWQofndldF9zdHJpbmcpCiAgCgpgYGAKYGBge3J9CgplbWRhdF9oeWRyb2xvZ2ljYWxfZW5zbyAlPiUKICBmaWx0ZXIoIWlzLm5hKGVuc29fVmFsdWUpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHdldCkpICU+JQogIGZpbHRlcighaXMubmEobGF0KSkgJT4lCiAgbXV0YXRlKHdldF9mYWN0b3IgPSBhc19mYWN0b3Iod2V0KSkgJT4lCiAgbXV0YXRlKEV2ZW50X2ZhY3RvciA9IGZjdF9yZWNvZGUoYXNfZmFjdG9yKEV2ZW50KSwgbm9fZXZlbnQgPSAiTiIsIG5lZ2F0aXZlID0gIi0iLCBwb3NpdGl2ZSA9ICIrIikpICU+JQogIG11dGF0ZSh3ZXRfc3RyaW5nID0gZmN0X3JlY29kZSh3ZXRfZmFjdG9yLCB3ZXRfZGlzYXN0ZXJzID0gIlRSVUUiLCBkcnlfZGlzYXN0ZXJzID0gIkZBTFNFIikpICU+JQogIHNlbGVjdChsbmcsIGxhdCwgRXZlbnRfZmFjdG9yLCB3ZXRfc3RyaW5nLCB3ZXQpICU+JQogIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSB3b3JsZF9tYXApICsKICBnZW9tX3RpbGUobWFwcGluZyA9IGFlcyh4ID0gbG5nLCB5ID0gbGF0LCB3aWR0aCA9IDIsIGhlaWdodCA9IDIsIGZpbGwgPSAxLCBhbHBoYSA9IDAuMDAxKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMod2V0X3N0cmluZyksIHJvd3MgPSB2YXJzKEV2ZW50X2ZhY3RvcikpCgpgYGAKYGBge3J9CgpldmVudF9udW1fbW9udGhzIDwtIGVuc29fZGF0YSAlPiUKICBncm91cF9ieShFdmVudCkgJT4lCiAgc3VtbWFyaXplKG51bV9tb250aHMgPSBuKCkpCgplbWRhdF9oeWRyb2xvZ2ljYWxfZW5zbyAlPiUKICBsZWZ0X2pvaW4oZXZlbnRfbnVtX21vbnRocywgYnkgPSBjKCJFdmVudCIpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGVuc29fVmFsdWUpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHdldCkpICU+JQogIGZpbHRlcighaXMubmEobGF0KSkgJT4lCiAgbXV0YXRlKHdldF9mYWN0b3IgPSBhc19mYWN0b3Iod2V0KSkgJT4lCiAgbXV0YXRlKEV2ZW50X2ZhY3RvciA9IGZjdF9yZWNvZGUoYXNfZmFjdG9yKEV2ZW50KSwgbm9fZXZlbnQgPSAiTiIsIG5lZ2F0aXZlID0gIi0iLCBwb3NpdGl2ZSA9ICIrIikpICU+JQogIG11dGF0ZSh3ZXRfc3RyaW5nID0gZmN0X3JlY29kZSh3ZXRfZmFjdG9yLCB3ZXRfZGlzYXN0ZXJzID0gIlRSVUUiLCBkcnlfZGlzYXN0ZXJzID0gIkZBTFNFIikpICU+JQogIHNlbGVjdChsbmcsIGxhdCwgRXZlbnRfZmFjdG9yLCB3ZXRfc3RyaW5nLCBudW1fbW9udGhzLCBudW1fbW9udGhzX2Rpc2FzdGVyKSAlPiUKICBhZGRfcm93KGxuZyA9IDEsIGxhdCA9IDEsIEV2ZW50X2ZhY3RvciA9ICdub19ldmVudCcsIHdldF9zdHJpbmcgPSAnZHJ5X2Rpc2FzdGVycycsIG51bV9tb250aHMgPSAxKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gd29ybGRfbWFwKSArCiAgZ2VvbV90aWxlKG1hcHBpbmcgPSBhZXMoeCA9IGxuZywgeSA9IGxhdCwgd2lkdGggPSAyLCBoZWlnaHQgPSAyLCBhbHBoYSA9IG51bV9tb250aHNfZGlzYXN0ZXIvbnVtX21vbnRocywgZmlsbCA9ICdyZWQnKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMod2V0X3N0cmluZyksIHJvd3MgPSB2YXJzKEV2ZW50X2ZhY3RvcikpICsKICBnZ3RpdGxlKCJTYW1lIHBsb3QgYXMgYWJvdmUgYnV0IHNjYWxlZCBieSBudW0gbW9udGhzIikKCmBgYAoKYGBge3J9CmVtZGF0X2h5ZHJvbG9naWNhbF9lbnNvICU+JQogIGxlZnRfam9pbihldmVudF9udW1fbW9udGhzLCBieSA9IGMoIkV2ZW50IikpICU+JQogIGZpbHRlcighaXMubmEoZW5zb19WYWx1ZSkpICU+JQogIGZpbHRlcighaXMubmEod2V0KSkgJT4lCiAgZmlsdGVyKCFpcy5uYShsYXQpKSAlPiUKICBtdXRhdGUod2V0X2ZhY3RvciA9IGFzX2ZhY3Rvcih3ZXQpKSAlPiUKICBtdXRhdGUoRXZlbnRfZmFjdG9yID0gZmN0X3JlY29kZShhc19mYWN0b3IoRXZlbnQpLCBub19ldmVudCA9ICJOIiwgbmVnYXRpdmUgPSAiLSIsIHBvc2l0aXZlID0gIisiKSkgJT4lCiAgbXV0YXRlKHdldF9zdHJpbmcgPSBmY3RfcmVjb2RlKHdldF9mYWN0b3IsIHdldF9kaXNhc3RlcnMgPSAiVFJVRSIsIGRyeV9kaXNhc3RlcnMgPSAiRkFMU0UiKSkgJT4lCiAgc2VsZWN0KGxuZywgbGF0LCBFdmVudF9mYWN0b3IsIHdldF9zdHJpbmcsIG51bV9tb250aHMpICU+JQogIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSB3b3JsZF9tYXApICsKICBzdGF0X2Jpbl8yZChtYXBwaW5nID0gYWVzKHggPSBsbmcsIHkgPSBsYXQpLCBiaW53aWR0aCA9IGMoMiwyKSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQodHJhbnMgPSAnbG9nJywgbG93ID0gJ3doaXRlJywgaGlnaCA9ICdyZWQnKSArIAogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMod2V0X3N0cmluZyksIHJvd3MgPSB2YXJzKEV2ZW50X2ZhY3RvcikpICsKICBnZ3RpdGxlKCIyRCBIaXN0b2dyYW0gQ291bnRzICIpCgpgYGAKYGBge3J9CgplbWRhdF9oeWRyb2xvZ2ljYWxfZW5zbyAlPiUKICBsZWZ0X2pvaW4oZXZlbnRfbnVtX21vbnRocywgYnkgPSBjKCJFdmVudCIpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGVuc29fVmFsdWUpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHdldCkpICU+JQogIGZpbHRlcighaXMubmEobGF0KSkgJT4lCiAgbXV0YXRlKHdldF9mYWN0b3IgPSBhc19mYWN0b3Iod2V0KSkgJT4lCiAgbXV0YXRlKEV2ZW50X2ZhY3RvciA9IGZjdF9yZWNvZGUoYXNfZmFjdG9yKEV2ZW50KSwgbm9fZXZlbnQgPSAiTiIsIG5lZ2F0aXZlID0gIi0iLCBwb3NpdGl2ZSA9ICIrIikpICU+JQogIG11dGF0ZSh3ZXRfc3RyaW5nID0gZmN0X3JlY29kZSh3ZXRfZmFjdG9yLCB3ZXRfZGlzYXN0ZXJzID0gIlRSVUUiLCBkcnlfZGlzYXN0ZXJzID0gIkZBTFNFIikpICU+JQogIHNlbGVjdChsbmcsIGxhdCwgRXZlbnRfZmFjdG9yLCB3ZXRfc3RyaW5nLCBudW1fbW9udGhzKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gd29ybGRfbWFwKSArCiAgc3RhdF9iaW5fMmQobWFwcGluZyA9IGFlcyh4ID0gbG5nLCB5ID0gbGF0LCBmaWxsID0gLi5kZW5zaXR5Li4pLCBiaW53aWR0aCA9IGMoMiwyKSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQodHJhbnMgPSAnbG9nJywgbG93ID0gJ3doaXRlJywgaGlnaCA9ICdyZWQnKSArIAogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMod2V0X3N0cmluZyksIHJvd3MgPSB2YXJzKEV2ZW50X2ZhY3RvcikpICsKICBnZ3RpdGxlKCIyRCBIaXN0b2dyYW0gRGVuc2l0eSIpCgpgYGAKCmBgYHtyfQoKZW1kYXRfaHlkcm9sb2dpY2FsX2Vuc28gJT4lCiAgbGVmdF9qb2luKGV2ZW50X251bV9tb250aHMsIGJ5ID0gYygiRXZlbnQiKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShlbnNvX1ZhbHVlKSkgJT4lCiAgZmlsdGVyKCFpcy5uYSh3ZXQpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGxhdCkpICU+JQogIG11dGF0ZSh3ZXRfZmFjdG9yID0gYXNfZmFjdG9yKHdldCkpICU+JQogIG11dGF0ZShFdmVudF9mYWN0b3IgPSBmY3RfcmVjb2RlKGFzX2ZhY3RvcihFdmVudCksIG5vX2V2ZW50ID0gIk4iLCBuZWdhdGl2ZSA9ICItIiwgcG9zaXRpdmUgPSAiKyIpKSAlPiUKICBtdXRhdGUod2V0X3N0cmluZyA9IGZjdF9yZWNvZGUod2V0X2ZhY3Rvciwgd2V0X2Rpc2FzdGVycyA9ICJUUlVFIiwgZHJ5X2Rpc2FzdGVycyA9ICJGQUxTRSIpKSAlPiUKICBzZWxlY3QobG5nLCBsYXQsIEV2ZW50X2ZhY3Rvciwgd2V0X3N0cmluZywgbnVtX21vbnRocywgbnVtX21vbnRoc19kaXNhc3RlcikgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IHdvcmxkX21hcCkgKwogIHN0YXRfYmluXzJkKG1hcHBpbmcgPSBhZXMoeCA9IGxuZywgeSA9IGxhdCwgd2VpZ2h0ID0gbnVtX21vbnRoc19kaXNhc3Rlci9udW1fbW9udGhzKSwgYmlud2lkdGggPSBjKDIsMikpICsKICBzY2FsZV9maWxsX2dyYWRpZW50KHRyYW5zID0gJ2xvZycsIGxvdyA9ICd3aGl0ZScsIGhpZ2ggPSAncmVkJykgKyAKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKHdldF9zdHJpbmcpLCByb3dzID0gdmFycyhFdmVudF9mYWN0b3IpKSArCiAgZ2d0aXRsZSgiMkQgSGlzdG9ncmFtIEludmVyc2UgV2VpZ2h0ZWQgYnkgTnVtIE1vbnRocyIpCgpgYGAKYGBge3J9CiMjIGNhbGN1bGF0ZSByZWxhdGl2ZSByaXNrIHdpdGhpbiBlYWNoIGJveAojIyMgY3JlYXRlIGJveGVzIGFjYyB0byByZXN5IFggcmVzeQoKcmVzeSA8LSAyLjUKCmVtZGF0X2h5ZHJvbG9naWNhbF9lbnNvICU+JQogIGxlZnRfam9pbihldmVudF9udW1fbW9udGhzLCBieSA9IGMoIkV2ZW50IikpICU+JQogIGZpbHRlcighaXMubmEoZW5zb19WYWx1ZSkpICU+JQogIGZpbHRlcighaXMubmEod2V0KSkgJT4lCiAgZmlsdGVyKCFpcy5uYShsYXQpKSAlPiUKICBtdXRhdGUod2V0X2ZhY3RvciA9IGFzX2ZhY3Rvcih3ZXQpKSAlPiUKICBtdXRhdGUoRXZlbnRfZmFjdG9yID0gZmN0X3JlY29kZShhc19mYWN0b3IoRXZlbnQpLCBub19ldmVudCA9ICJOIiwgbmVnYXRpdmUgPSAiLSIsIHBvc2l0aXZlID0gIisiKSkgJT4lCiAgbXV0YXRlKHdldF9zdHJpbmcgPSBmY3RfcmVjb2RlKHdldF9mYWN0b3IsIHdldF9kaXNhc3RlcnMgPSAiVFJVRSIsIGRyeV9kaXNhc3RlcnMgPSAiRkFMU0UiKSkgJT4lCiAgbXV0YXRlKGxhdF9ib3ggPSAoYXMuaW50ZWdlcihsYXQpICUvJSByZXN5KSAqIHJlc3kgLCBsbmdfYm94ID0gKGFzLmludGVnZXIobG5nKSAlLyUgcmVzeSkgKiByZXN5KSAlPiUKICBtdXRhdGUoZGlzX25vX2ZhY3RvciA9IGFzX2ZhY3RvcihgRGlzIE5vYCkpICU+JQogIGdyb3VwX2J5KGxhdF9ib3gsIGxuZ19ib3gsIEV2ZW50X2ZhY3Rvciwgd2V0X3N0cmluZywgZGlzX25vX2ZhY3RvcikgJT4lCiAgc3VtbWFyaXplKG51bV9tb250aHMgPSBmaXJzdChudW1fbW9udGhzKSwgbnVtX2Rpc2FzdGVyX21vbnRoID0gbWVhbihudW1fbW9udGhzX2Rpc2FzdGVyKSkgJT4lCiAgZ3JvdXBfYnkobGF0X2JveCwgbG5nX2JveCwgRXZlbnRfZmFjdG9yLCB3ZXRfc3RyaW5nKSAlPiUKICBzdW1tYXJpemUobnVtX21vbnRocyA9IGZpcnN0KG51bV9tb250aHMpLCBudW1fZGlzYXN0ZXJfbW9udGhzID0gc3VtKG51bV9kaXNhc3Rlcl9tb250aCkpICU+JQogIG11dGF0ZShkaXNhc3Rlcl9yYXRlID0gbnVtX2Rpc2FzdGVyX21vbnRocyAvIG51bV9tb250aHMpICU+JQogIHBpdm90X3dpZGVyKGlkX2NvbHMgPSBjKGxhdF9ib3gsIGxuZ19ib3gpLCBuYW1lc19mcm9tID0gYyhFdmVudF9mYWN0b3IsIHdldF9zdHJpbmcpLCB2YWx1ZXNfZnJvbSA9IGMoZGlzYXN0ZXJfcmF0ZSksIHZhbHVlc19maWxsID0gMCkgJT4lCiAgbXV0YXRlKHBvc2l0aXZlX3dldF9yZWxhdGl2ZV9yaXNrID0gcG9zaXRpdmVfd2V0X2Rpc2FzdGVycyAvIG5vX2V2ZW50X3dldF9kaXNhc3RlcnMsIAogICAgICAgICBuZWdhdGl2ZV93ZXRfcmVsYXRpdmVfcmlzayA9IG5lZ2F0aXZlX3dldF9kaXNhc3RlcnMgLyBub19ldmVudF93ZXRfZGlzYXN0ZXJzLCAKICAgICAgICAgcG9zaXRpdmVfZHJ5X3JlbGF0aXZlX3Jpc2sgPSAgcG9zaXRpdmVfZHJ5X2Rpc2FzdGVycyAvIG5vX2V2ZW50X2RyeV9kaXNhc3RlcnMsCiAgICAgICAgIG5lZ2F0aXZlX2RyeV9yZWxhdGl2ZV9yaXNrID0gbmVnYXRpdmVfZHJ5X2Rpc2FzdGVycyAvIG5vX2V2ZW50X2RyeV9kaXNhc3RlcnMpICU+JQogIHNlbGVjdChsYXRfYm94LCBsbmdfYm94LCBwb3NpdGl2ZV93ZXRfcmVsYXRpdmVfcmlzaywgbmVnYXRpdmVfd2V0X3JlbGF0aXZlX3Jpc2ssIHBvc2l0aXZlX2RyeV9yZWxhdGl2ZV9yaXNrLCBuZWdhdGl2ZV9kcnlfcmVsYXRpdmVfcmlzaykgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHBvc2l0aXZlX3dldF9yZWxhdGl2ZV9yaXNrLCBuZWdhdGl2ZV93ZXRfcmVsYXRpdmVfcmlzaywgcG9zaXRpdmVfZHJ5X3JlbGF0aXZlX3Jpc2ssIG5lZ2F0aXZlX2RyeV9yZWxhdGl2ZV9yaXNrKSwgbmFtZXNfdG8gPSAncmlzaycsIHZhbHVlc190byA9ICd2YWx1ZScpICU+JQogIG11dGF0ZShyaXNrX2ZhY3RvciA9IGFzX2ZhY3RvcihyaXNrKSwgdmFsdWVzX2NsZWFuZWQgPSBpZl9lbHNlKGlzLmluZmluaXRlKHZhbHVlKSwgMTgsIHZhbHVlKSkgJT4lCiAgbXV0YXRlKHJlbGF0aXZlX3Jpc2tfY2xlYW5lZCA9IGlmX2Vsc2UoaXMubmFuKHZhbHVlc19jbGVhbmVkKSwgMCwgdmFsdWVzX2NsZWFuZWQpKSAlPiUKICBtdXRhdGUocmVsYXRpdmVfcmlza19jbGVhbmVkMiA9IGlmX2Vsc2UoKHJlbGF0aXZlX3Jpc2tfY2xlYW5lZCkgPiAyLCAyLCByZWxhdGl2ZV9yaXNrX2NsZWFuZWQpKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gd29ybGRfbWFwKSArCiAgZ2VvbV90aWxlKG1hcHBpbmcgPSBhZXMoeCA9IGxuZ19ib3gsIHkgPSBsYXRfYm94LCBmaWxsID0gcmVsYXRpdmVfcmlza19jbGVhbmVkMiwgd2lkdGggPSByZXN5KSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKG1pZHBvaW50ID0gMSwgbGltaXRzID0gYygwLCAyKSwgbG93ID0gJ2N5YW4nLCBoaWdoID0gJ3JlZCcpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKHJpc2tfZmFjdG9yKSkrCiAgZ2d0aXRsZSgiUmVsYXRpdmUgcmlzayBwbG90IHVzaW5nIGNhbGN1bGF0aW9ucyBvZiB0aGUgZm9ybSBbe251bV9kaXNhc3RlcnNfcG9zaXRpdmVfd2V0IC8gbnVtX21vbnRoc19wb3NpdGl2ZX0gLyB7bnVtX2Rpc2FzdGVyc19ub19ldmVudF93ZXQgLyBudW1fbW9udGhzX25vX2V2ZW50fV0iKQogIAogIAoKYGBgCgpgYGB7cn0KIyMgY2FsY3VsYXRlIHBlcmNlbnQgb2YgdG90YWwgZGlzYXN0ZXJzIHdpdGhpbiBlYWNoIGJveAojIyMgY3JlYXRlIGJveGVzIDJ4MgoKcmVzeSA8LSAyLjUKCmVtZGF0X2h5ZHJvbG9naWNhbF9lbnNvICU+JQogIGxlZnRfam9pbihldmVudF9udW1fbW9udGhzLCBieSA9IGMoIkV2ZW50IikpICU+JQogIGZpbHRlcighaXMubmEoZW5zb19WYWx1ZSkpICU+JQogIGZpbHRlcighaXMubmEod2V0KSkgJT4lCiAgZmlsdGVyKCFpcy5uYShsYXQpKSAlPiUKICBtdXRhdGUod2V0X2ZhY3RvciA9IGFzX2ZhY3Rvcih3ZXQpKSAlPiUKICBtdXRhdGUoRXZlbnRfZmFjdG9yID0gZmN0X3JlY29kZShhc19mYWN0b3IoRXZlbnQpLCBub19ldmVudCA9ICJOIiwgbmVnYXRpdmUgPSAiLSIsIHBvc2l0aXZlID0gIisiKSkgJT4lCiAgbXV0YXRlKHdldF9zdHJpbmcgPSBmY3RfcmVjb2RlKHdldF9mYWN0b3IsIHdldF9kaXNhc3RlcnMgPSAiVFJVRSIsIGRyeV9kaXNhc3RlcnMgPSAiRkFMU0UiKSkgJT4lCiAgbXV0YXRlKGxhdF9ib3ggPSAoYXMuaW50ZWdlcihsYXQpICUvJSByZXN5KSAqIHJlc3kgLCBsbmdfYm94ID0gKGFzLmludGVnZXIobG5nKSAlLyUgcmVzeSkgKiByZXN5KSAlPiUKICBtdXRhdGUoZGlzX25vX2ZhY3RvciA9IGFzX2ZhY3RvcihgRGlzIE5vYCkpICU+JQogIGdyb3VwX2J5KGxhdF9ib3gsIGxuZ19ib3gsIEV2ZW50X2ZhY3Rvciwgd2V0X3N0cmluZywgZGlzX25vX2ZhY3RvcikgJT4lCiAgc3VtbWFyaXplKG51bV9tb250aHMgPSBmaXJzdChudW1fbW9udGhzKSwgbnVtX2Rpc2FzdGVyX21vbnRoID0gbWVhbihudW1fbW9udGhzX2Rpc2FzdGVyKSkgJT4lCiAgZ3JvdXBfYnkobGF0X2JveCwgbG5nX2JveCwgRXZlbnRfZmFjdG9yLCB3ZXRfc3RyaW5nKSAlPiUKICBzdW1tYXJpemUobnVtX21vbnRocyA9IGZpcnN0KG51bV9tb250aHMpLCBudW1fZGlzYXN0ZXJfbW9udGhzID0gc3VtKG51bV9kaXNhc3Rlcl9tb250aCkpICU+JQogIG11dGF0ZShkaXNhc3Rlcl9yYXRlID0gbnVtX2Rpc2FzdGVyX21vbnRocyAvIG51bV9tb250aHMpICU+JQogIHBpdm90X3dpZGVyKGlkX2NvbHMgPSBjKGxhdF9ib3gsIGxuZ19ib3gpLCBuYW1lc19mcm9tID0gYyhFdmVudF9mYWN0b3IsIHdldF9zdHJpbmcpLCB2YWx1ZXNfZnJvbSA9IGMoZGlzYXN0ZXJfcmF0ZSksIHZhbHVlc19maWxsID0gMCkgJT4lCiAgbXV0YXRlKHBvc2l0aXZlX3dldF9wZXJjZW50ID0gcG9zaXRpdmVfd2V0X2Rpc2FzdGVycyAvIChub19ldmVudF93ZXRfZGlzYXN0ZXJzICsgcG9zaXRpdmVfd2V0X2Rpc2FzdGVycyArIG5lZ2F0aXZlX3dldF9kaXNhc3RlcnMpICwgCiAgICAgICAgIG5lZ2F0aXZlX3dldF9wZXJjZW50ID0gbmVnYXRpdmVfd2V0X2Rpc2FzdGVycyAvIChub19ldmVudF93ZXRfZGlzYXN0ZXJzICsgcG9zaXRpdmVfd2V0X2Rpc2FzdGVycyArIG5lZ2F0aXZlX3dldF9kaXNhc3RlcnMpLCAKICAgICAgICAgcG9zaXRpdmVfZHJ5X3BlcmNlbnQgPSAgcG9zaXRpdmVfZHJ5X2Rpc2FzdGVycyAvIChub19ldmVudF9kcnlfZGlzYXN0ZXJzICsgcG9zaXRpdmVfZHJ5X2Rpc2FzdGVycyArIG5lZ2F0aXZlX2RyeV9kaXNhc3RlcnMpLAogICAgICAgICBuZWdhdGl2ZV9kcnlfcGVyY2VudCA9ICBuZWdhdGl2ZV9kcnlfZGlzYXN0ZXJzIC8gKG5vX2V2ZW50X2RyeV9kaXNhc3RlcnMgKyBwb3NpdGl2ZV9kcnlfZGlzYXN0ZXJzICsgbmVnYXRpdmVfZHJ5X2Rpc2FzdGVycykKICAgICAgICAgKSAlPiUKICBzZWxlY3QobGF0X2JveCwgbG5nX2JveCwgcG9zaXRpdmVfd2V0X3BlcmNlbnQsIG5lZ2F0aXZlX3dldF9wZXJjZW50LCBwb3NpdGl2ZV9kcnlfcGVyY2VudCwgbmVnYXRpdmVfZHJ5X3BlcmNlbnQpICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhwb3NpdGl2ZV93ZXRfcGVyY2VudCwgbmVnYXRpdmVfd2V0X3BlcmNlbnQsIHBvc2l0aXZlX2RyeV9wZXJjZW50LCBuZWdhdGl2ZV9kcnlfcGVyY2VudCksIG5hbWVzX3RvID0gJ3R5cGV5JywgdmFsdWVzX3RvID0gJ3ZhbHVlJykgJT4lCiAgbXV0YXRlKHR5cGVfZmFjdG9yID0gYXNfZmFjdG9yKHR5cGV5KSwgdmFsdWVzID0gaWZfZWxzZShpcy5uYW4odmFsdWUpLCAwLCB2YWx1ZSkpICU+JQogIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSB3b3JsZF9tYXApICsKICBnZW9tX3RpbGUobWFwcGluZyA9IGFlcyh4ID0gbG5nX2JveCwgeSA9IGxhdF9ib3gsIGZpbGwgPSB2YWx1ZXMsIHdpZHRoID0gcmVzeSkpICsKICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICd3aGl0ZScsIGhpZ2ggPSAncmVkJykgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnModHlwZV9mYWN0b3IpKSsKICBnZ3RpdGxlKCJEaXNhc3RlciBQZXJjZW50IHBsb3QgdXNpbmcgY2FsY3VsYXRpb25zIG9mIHRoZSBmb3JtIFtwb3NpdGl2ZV93ZXQgLyBhbGxfd2V0XSIpCiAgCgpgYGA=